﻿var http = require('http'); // pour créer le serveur
var url = require("url"); // pour récupérer l'URL
var querystring = require('querystring'); // pour récupérer les paramètres
var fs = require('fs'); // lecture de fichier
var EventEmitter = require('events').EventEmitter; // émetteur d'évènements
var express = require('express');

var jeu = new EventEmitter();

var tempsDePartie = 30000;
var tempsRestant = 0; //tempsDePartie / 1000;
var nbSetsDispo;

var port = process.env.port || 1337;

var app = express();

var server = http.Server(app);


app.use(express.static(__dirname));
app.get('/', function (req, res) {
    res.setHeader('content-Type', 'text/plain');
    res.end('Vous êtes à l\'accueil');
});

app.get('/game', function (req, res) {
    res.render('game.ejs');
});

setInterval(function () {
    tempsRestant--;
    console.log(tempsRestant);
    jeu.emit('timer');
}, 1000);

function randomInt(low, high) {
    return Math.floor(Math.random() * (high - low) + low);
}


// abcd
// avec
// a : couleur (1 : R, 2 : V, 3 : B)
// b : remplissage (1 : plein, 2 : rayé, 3 : vide)
// c : quantité (1, 2, 3)
// d : forme (1 : éclair, 2 : sphère, 3 : triangle)
function genererCombinaison() {
    var combi = '';
    var i;
    for (i = 0; i != 4; ++i) {
        combi += randomInt(1, 4);
    }
    
    return combi;
}

function carteDejaTiree(tab, carte) {
    var i;
    for (i = 0; i != tab.length; ++i) {
        if (tab[i].value == carte) {
            //console.log('-' + tab[i] + '- == -' + carte + '-');
            return true;
        } else {
            //console.log('-' + tab[i] + '- != -' + carte + '-');
        }
    }
    
    return false;
}

function genererNouvellePartieEnJSON() {
    var tabCartes = [];
    var i;
    
    for (i = 0; i != 12; ++i) {
        var carteTiree = genererCombinaison();
        if (carteDejaTiree(tabCartes, carteTiree)) {
            i--;
        } else {
            //result.push({ name: name, goals: goals[name] });
            tabCartes.push({ name: 'carte' + i, value: carteTiree });
        }
    }
    
    tabCartes.push({ name: 'nbSets', value: 8 });
    
    return JSON.stringify(tabCartes);
}

setInterval(function () {
    var nouveauJeu = genererNouvellePartieEnJSON();
    
    jeu.emit('Nouvelle partie', nouveauJeu); // 
    io.sockets.emit('Nouvelle partie', nouveauJeu);
}, tempsDePartie);

var io = require('socket.io')(server);
io.sockets.on('connection', function (socket) {
    
    console.log('Un client est connecté !');
    
    
    socket.on('Set', function (setJoueur) {
        var setPropose = JSON.parse(setJoueur);
        if (estUnSetValide(setPropose[0].value, setPropose[1].value, setPropose[2].value)) {
            socket.emit('Set valide', setJoueur);
        } else {
            socket.emit('Set invalide', setJoueur);
        }

    })
});

function propriete(prop1, prop2, prop3) {
    if ((prop1 == prop2) && (prop2 == prop3) && (prop1 == prop3)) {
        return true;
    }
    else if ((prop1 != prop2) && (prop2 != prop3) && (prop1 != prop3)) {
        return true;
    }
    else {
        return false;
    }

}

function estUnSetValide(carte1, carte2, carte3) {
    var setCorrect = true;
    for (var i = 0; i < 4; i++) {
        var propCorrect = propriete(carte1.charAt(i), carte2.charAt(i), carte3.charAt(i));
        if (!propCorrect) {
            setCorrect = false;
        }
    }
    return setCorrect;
}
/*
io.sockets.on('Set', function (setJoueur, socket) {
    console.log('coucou');
    var setPropose = JSON.parse(nouvelleCombi);
    if (estUnSetValide(setPropose[0].value, setPropose[1].value, setPropose[2].value)) {
        socket.emit('Set valide', setJoueur);
    } else {
        socket.emit('Set invalide', setJoueur);
    }
});*/

jeu.on('timer', function () {
    io.sockets.emit('timer', tempsRestant);
});

jeu.on('Nouvelle partie', function (nouvelleCombi) {
    var infoPartie = JSON.parse(nouvelleCombi);
    console.log('Nouvelle partie ! ' + infoPartie[12].value);
    tempsRestant = tempsDePartie / 1000;
});
//app.listen(port);
server.listen(port);
// server.close();

//jeu.emit('Nouvelle partie', JSON.stringify(tabCartes)); //
//io.sockets.emit('Nouvelle partie', genererNouvellePartieEnJSON());